package locadora.aplicacao;

import miscelanea.Data;
import locadora.negocio.pessoas.*;

public class TelaCliente extends Tela {

	public TelaCliente(Pessoa usuario) {
		super("Gerenciamento de clientes", usuario);
	}
	
	protected void imprimirTela() {
		while(true) {
			int opcao = -1;
			while(opcao < 0 || opcao > 5) {
				this.limpar();
				this.imprimirMensagem(this.titulo);
				this.imprimirMensagem("");
				this.imprimirMensagem("(1) Cadastrar cliente");
				this.imprimirMensagem("(2) Alterar dados do cliente");
				this.imprimirMensagem("(3) Exluir cliente");
				this.imprimirMensagem("");
				this.imprimirMensagem("(4) Realizar empréstimo");
				this.imprimirMensagem("(5) Realizar devolução");
				this.imprimirMensagem("");
				this.imprimirMensagem("(0) Voltar");
				this.imprimirMensagem("");
				this.requisitarEntrada("Por favor, escolha uma opção.");
				try { opcao = Integer.parseInt(this.lerEntrada()); }
				catch(Exception e) { this.imprimirErro("Opção inválida!"); }
			}
			this.limpar();
			switch(opcao) {
				case 1: this.cadastrarCliente(); break;
				case 2: this.atualizarCliente(); break;
				case 3: this.removerCliente(); break;
				case 4: this.realizarEmprestimo(); break;
				case 5: this.realizarDevolucao(); break;
				case 0: return;
			}
		}
	}
	
	private void realizarEmprestimo() {
		String chavePessoa, chaveItem;
		Data dataLocacao, dataDevolucao;
		
		this.requisitarEntrada("Por favor, insira a chave do cliente.");
		chavePessoa = new String(this.lerEntrada());
		
		this.requisitarEntrada("Por favor, insira a chave do item.");
		chaveItem = new String(this.lerEntrada());
		
		this.requisitarEntrada("Por favor, insira a data de locação (no formato ddmmyyyy).");
		try { dataLocacao = new Data(this.lerEntrada()); }
		catch(Exception e) { 
			this.imprimirErro("Data inválida!");
			return;
		}
		
		this.requisitarEntrada("Por favor, insira a data de devolução (no formato ddmmyyyy).");
		try { dataDevolucao = new Data(this.lerEntrada()); }
		catch(Exception e) { 
			this.imprimirErro("Data inválida!");
			return;
		}
		
		try {
			if(this.usuario instanceof Funcionario) {
				Funcionario f = (Funcionario) this.usuario;
				f.realizarEmprestimo(chavePessoa, chaveItem, dataLocacao, dataDevolucao);
			} else if(this.usuario instanceof Gerente) {
				Gerente g = (Gerente) this.usuario;
				g.realizarEmprestimo(chavePessoa, chaveItem, dataLocacao, dataDevolucao);
			}
		} catch(Exception e) { this.imprimirErro(e.getMessage()); }
	}
	
	private void realizarDevolucao() {
		Data dataDevolucao;
		String chavePessoa, chaveItem;
		float adicionalPorAtraso, credito;
		
		this.requisitarEntrada("Por favor, insira a chave do cliente.");
		chavePessoa = new String(this.lerEntrada());
		
		this.requisitarEntrada("Por favor, insira a chave do item.");
		chaveItem = new String(this.lerEntrada());
		
		this.requisitarEntrada("Por favor, insira a data de devolução (no formato ddmmyyyy).");
		try { dataDevolucao = new Data(this.lerEntrada()); }
		catch(Exception e) { 
			this.imprimirErro("Data inválida!");
			return;
		}
		
		this.requisitarEntrada("Por favor, insira o valor do custo adicional por atraso.");
		try {
			adicionalPorAtraso = Float.parseFloat(this.lerEntrada());
			if(adicionalPorAtraso < 0) throw new Exception(); 
		} catch(Exception e) { 
			this.imprimirErro("Valor inválido!");
			return;
		}
		
		this.requisitarEntrada("Por favor, insira o valor pago.");
		try {
			credito = Float.parseFloat(this.lerEntrada());
			if(credito < 0) throw new Exception(); 
		} catch(Exception e) { 
			this.imprimirErro("Valor inválido!");
			return;
		}
		
		try {
			if(this.usuario instanceof Funcionario) {
				Funcionario f = (Funcionario) this.usuario;
				f.devolverItem(chavePessoa, chaveItem, dataDevolucao, adicionalPorAtraso, credito);
			} else if(this.usuario instanceof Gerente) {
				Gerente g = (Gerente) this.usuario;
				g.devolverItem(chavePessoa, chaveItem, dataDevolucao, adicionalPorAtraso, credito);
			}
		} catch(Exception e) { this.imprimirErro(e.getMessage()); }
	}
	
	private void cadastrarCliente() {
		Cliente cliente = this.novoCliente();
		if(cliente == null) return;
		try {
			if(this.usuario instanceof Funcionario) {
				Funcionario f = (Funcionario) this.usuario;
				f.adicionar(cliente);
			} else if(this.usuario instanceof Gerente) {
				Gerente g = (Gerente) this.usuario;
				g.adicionar(cliente);
			}
		} catch(Exception e) { this.imprimirErro(e.getMessage()); }
	}
	
	private void atualizarCliente() {
		this.requisitarEntrada("Por favor, insira a chave do cliente a ser atualizado.");
		try {
			String chave = this.lerEntrada();
			Cliente cliente = this.novoCliente();
			if(cliente == null) return;
			if(this.usuario instanceof Funcionario) {
				Funcionario f = (Funcionario) this.usuario;
				f.atualizar(chave, cliente);
			} else if(this.usuario instanceof Gerente) {
				Gerente g = (Gerente) this.usuario;
				g.atualizar(chave, cliente);
			}
		} catch(Exception e) { this.imprimirErro(e.getMessage()); }
	}
	
	private void removerCliente() {
		this.requisitarEntrada("Por favor, insira a chave do cliente a ser removido.");
		try {
			String chave = this.lerEntrada();
			if(this.usuario instanceof Funcionario) {
				Funcionario f = (Funcionario) this.usuario;
				f.removerPessoa(chave);
			} else if(this.usuario instanceof Gerente) {
				Gerente g = (Gerente) this.usuario;
				g.removerPessoa(chave);
			}
		} catch(Exception e) { this.imprimirErro(e.getMessage()); }
	}
	
	private Cliente novoCliente() {
		Data dataNascimento;
		String nome, identidade, orgaoExpedidor, CPF, logradouro, CEP, bairro, cidade, estado;
		String tmp;
		
		this.requisitarEntrada("Por favor, insira o nome do cliente.");
		tmp = this.lerEntrada();
		if(tmp.length() < 1 ) { 
			this.imprimirErro("O nome não pode ficar em branco!");
			return null;
		} else {
			nome = new String(tmp);
		}
		
		this.requisitarEntrada("Por favor, insira a data de nascimento do cliente (no formato ddmmyyyy).");
		try { 
			dataNascimento = new Data(this.lerEntrada());
		} catch(Exception e) { 
			this.imprimirErro("Data inválida!");
			return null;
		}
		
		this.requisitarEntrada("Por favor, insira a identidade do cliente.");
		tmp = this.lerEntrada();
		if(tmp.length() < 1 ) { 
			this.imprimirErro("A identidade não pode ficar em branco!");
			return null;
		} else {
			identidade = new String(tmp);
		}
		
		this.requisitarEntrada("Por favor, insira o órgão expedidor da identidade.");
		tmp = this.lerEntrada();
		orgaoExpedidor = new String(tmp);
		
		this.requisitarEntrada("Por favor, insira o CPF do cliente.");
		tmp = this.lerEntrada();
		if(tmp.length() < 1 ) { 
			this.imprimirErro("O CPF não pode ficar em branco!");
			return null;
		} else {
			CPF = new String(tmp);
		}

		this.requisitarEntrada("Por favor, insira o logradouro do cliente.");
		tmp = this.lerEntrada();
		if(tmp.length() < 1 ) { 
			this.imprimirErro("O logradouro não pode ficar em branco!");
			return null;
		} else {
			logradouro = new String(tmp);
		}
	
		this.requisitarEntrada("Por favor, insira o bairro do cliente.");
		tmp = this.lerEntrada();
		if(tmp.length() < 1 ) { 
			this.imprimirErro("O bairro não pode ficar em branco!");
			return null;
		} else {
			bairro = new String(tmp);
		}
		
		this.requisitarEntrada("Por favor, insira a cidade do cliente.");
		tmp = this.lerEntrada();
		if(tmp.length() < 1 ) { 
			this.imprimirErro("A cidade não pode ficar em branco!");
			return null;
		} else {
			cidade = new String(tmp);
		}
		
		this.requisitarEntrada("Por favor, insira o estado do cliente.");
		tmp = this.lerEntrada();
		if(tmp.length() < 1 ) { 
			this.imprimirErro("O estado não pode ficar em branco!");
			return null;
		} else {
			estado = new String(tmp);
		}
		
		this.requisitarEntrada("Por favor, insira o CEP do cliente.");
		tmp = this.lerEntrada();
		if(tmp.length() < 1 ) { 
			this.imprimirErro("O CEP não pode ficar em branco!");
			return null;
		} else {
			CEP = new String(tmp);
		}
		
		Cliente cliente = null;
		try { cliente = new Cliente(nome, dataNascimento, identidade, orgaoExpedidor, CPF, logradouro, CEP, bairro, cidade, estado); }
		catch(Exception e) { this.imprimirErro(e.getMessage()); }

		return cliente;
	}
	
	public static void main(String[] args) {
		try {
			Data data = new Data("03011991");
			Funcionario func = new Funcionario("Joao", data, "MG17064422", "SSPMG", "11062132629", "rua", "31710200", "plan", "BH", "MG");
			TelaCliente tela = new TelaCliente(func);
			tela.imprimirTela();
		} catch(Exception e) { System.out.println(e.getMessage()); }
	}
}


